このセクションには、ECMAScript言語の非規範的な概要が含まれています。
ECMAScriptは、ホスト環境内で計算を実行し、計算オブジェクトを操作するためのオブジェクト指向プログラミング言語です。ここで定義されているECMAScriptは、それだけで自己完結させることを意図していません。実際この仕様には、外部データの入力または計算結果の出力に関する規定はありません。 代わりに、ECMAScriptプログラムの計算環境は、この仕様で説明されているオブジェクトやその他の機能だけでなく、特定の環境固有のオブジェクトも提供することが期待されます。 アクセス可能な特定のプロパティと、ECMAScriptプログラムから呼び出すことができる特定の関数を提供する場合があります。
ECMAScriptはもともとスクリプト言語として設計されましたが、汎用プログラミング言語として広く使用されるようになりました。 スクリプト言語は、既存のシステムの機能を操作、カスタマイズ、および自動化するために使用されるプログラミング言語です。 このようなシステムでは、便利な機能がユーザーインターフェイスを介して既に利用可能であることを前提として、スクリプト言語はその機能をプログラム制御に公開するためのメカニズムです。 このように、既存のシステムはオブジェクトとファシリティのホスト環境を提供し、スクリプト言語の機能を提供すると言われています。 スクリプト言語は、プロのプログラマーと非プロのプログラマーの両方による使用を目的としています。
ECMAScriptはもともとWebスクリプト言語として設計されており、ブラウザーでWebページを活性化し、Webベースのクライアント/サーバーアーキテクチャの一部としてサーバー計算を実行するメカニズムを提供します。 ECMAScriptは現在、さまざまなホスト環境にコアスクリプト機能を提供するために使用されています。 したがって、このドキュメントでは、特定のホスト環境とは別に、コア言語を指定しています。
現在ではECMAScriptは単純なスクリプティングを超えて、多くの異なる環境とスケールでのプログラミングタスクの全範囲に使用されています。 ECMAScriptの使用が拡大するにつれて、ECMAScriptが提供する機能と機能も拡大しています。 ECMAScriptは現在、完全な機能を備えた汎用プログラミング言語です。
ECMAScriptの機能のいくつかは、他のプログラミング言語で使用されているものと似ています。 特に次に記載する、C、Java™、Self、およびSchemeです。
ISO/IEC 9899:1996, Programming Languages — C.
Gosling, James, Bill Joy and Guy Steele. The Java™ Language Specification. Addison Wesley Publishing Co., 1996.
Ungar, David, and Smith, Randall B. Self: The Power of Simplicity. OOPSLA '87 Conference Proceedings, pp. 227-241, Orlando, FL, October 1987.
IEEE Standard for the Scheme Programming Language. IEEE Std 1178-1990.
4.1 ウェブスクリプティング(Web Scripting)
Webブラウザーは、クライアント側の計算のためのECMAScriptホスト環境を提供します。 たとえばウィンドウ、メニュー、ポップアップ、ダイアログボックス、テキスト領域、アンカー、フレーム、履歴、Cookie、および入出力を表すオブジェクトです。さらにホスト環境は、フォーカスの変更、ページと画像のロード、アンロード、エラーと中止、選択、フォーム送信、マウス操作などのスクリプトコードをイベントで通知する手段を提供します。 スクリプトコードはHTML内に記述さます。表示されるページは、ユーザーインターフェイス要素と固定および計算されたテキストと画像の組み合わせです。 スクリプトコードはユーザーの操作に反応し、メインプログラムは必要ありません。
Webサーバーは、リクエスト、クライアント、およびファイルを表すオブジェクト、データをロックして共有するメカニズムを含む、サーバー側の計算のための異なるホスト環境を提供します。ブラウザー側とサーバー側のスクリプトを一緒に使用することにより、Webベースのアプリケーション用にカスタマイズされたユーザーインターフェイスを提供しながら、クライアントとサーバー間で計算を分散することができます。
ECMAScriptをサポートする各Webブラウザーとサーバーは独自のホスト環境を提供することで、ECMAScript実行環境を完成させます。
4.2 ECMAScript概要(ECMAScript Overview)
以下はECMAScriptの非公式の概要です。言語のすべての部分が説明されているわけではありません。 この概要は、標準規格の一部ではありません。
ECMAScriptはオブジェクトベースです。基本言語とホスト機能はオブジェクトによって提供されます。ECMAScriptプログラムは通信オブジェクトのクラスターです。
ECMAScriptでは、オブジェクトは0個以上のプロパティのコレクションであり、それぞれに各プロパティの使用方法を決定する属性があります。たとえば、プロパティのWritable属性がfalseに設定されている場合、プロパティに別の値を割り当てるために実行されたECMAScriptコードによる試行は失敗します。
プロパティは、他のオブジェクト、プリミティブ値、または関数を保持するコンテナです。
プリミティブ値は、次の組み込み型のいずれかのメンバーです。
Undefined、Null、Boolean、Number、BigInt、String、Symbol
オブジェクトは組み込み型Objectのメンバーです。
関数は呼び出し可能なオブジェクトです。
プロパティを介してオブジェクトに関連付けられている関数は、メソッドと呼ばれます。
ECMAScriptは、ECMAScriptエンティティの定義を完成させる組み込みオブジェクトのコレクションを定義します。
これらの組み込みオブジェクトには、グローバルオブジェクトや次のようなオブジェクトが含まれます。
・Object、Function、Boolean、Symbol、およびさまざまなErrorオブジェクトを含む、言語のランタイムセマンティクスの基礎となるオブジェクト。
・Math、Number、Dateなどの数値を表現および操作するオブジェクト。 テキスト処理オブジェクトStringおよびRegExp。
・配列を含むインデックス付きの値のコレクションであるオブジェクト、および要素がすべて特定の数値データ表現を持つ9種類の型付き配列。
・MapおよびSetオブジェクトを含むキー付きコレクション。
・JSONオブジェクト、ArrayBuffer、SharedArrayBuffer、DataViewなどの構造化データをサポートするオブジェクト。
・ジェネレータ関数やPromiseオブジェクトなどの制御抽象化をサポートするオブジェクト。
・ProxyとReflectを含むreflectionオブジェクト。
ECMAScriptでは、一連の組み込み演算子も定義されています。 ECMAScript演算子には、さまざまな単項演算、乗算演算子、加算演算子、ビット単位のシフト演算子、関係演算子、等値演算子、バイナリビット単位演算子、バイナリ論理演算子、代入演算子、およびカンマ演算子が含まれます。
大規模なECMAScriptプログラムのために、プログラムをステートメントと宣言の複数のシーケンスに分割できるようにするモジュール機能がサポートされています。
各モジュールは、他のモジュールを使用する宣言と、他のモジュールで使用できる宣言を明示的に識別します。
ECMAScript構文は、意図的にJava構文に似せています。 しかしECMAScript構文は、使いやすいスクリプト言語として機能できるように定義しています。たとえば、変数はその型を宣言する必要がありませんし、型はプロパティに関連付けられていません。
また、定義された関数は、呼び出しの前に宣言をテキストで表示する必要もありません。
4.2.1 オブジェクト(Objects)
ECMAScriptにはクラス定義の構文がありますが、ECMAScriptオブジェクトは、C ++、Smalltalk、Javaなどの基本的なクラスベースではありません。
代わりに、リテラル表記法や、コンストラクター(オブジェクトを作成し、関数内でプロパティに初期値を割り当ててオブジェクトのすべてまたは一部を初期化する)など、さまざまな方法でオブジェクトを作成できます。
prototypeプロパティ
各コンストラクターは、プロトタイプベースの継承と共有プロパティの実装に使用される「prototype」という名前のプロパティを持つ関数です。
オブジェクトは、new式でコンストラクターを呼び出してして作成されます。 たとえば、new Date(2009、11)は新しいDateオブジェクトを作成します。 newを使用せずにコンストラクターを呼び出すと、コンストラクターに依存する結果が生じます。 たとえば、Date()は、オブジェクトではなく現在の日付と時刻の文字列表現を生成します。
コンストラクターによって作成されたすべてのオブジェクトは、そのコンストラクターの「prototype」プロパティの値への暗黙的な参照(オブジェクトのプロトタイプと呼ばれます)があります。
プロトタイプチェーン
さらに、プロトタイプ(「prototype」プロパティではない)には、そのプロトタイプへのnull以外の暗黙的な参照が含まれる場合があります。 これはプロトタイプチェーンと呼ばれます。
B.プロトタイプ={ メンバ1、メンバ2,メンバ3... プロトタイプへの暗黙的な参照={ メンバ1、メンバ2,メンバ3... プロトタイプへの暗黙的な参照={ } } }
オブジェクトのプロパティへの参照が行われると、プロトタイプチェーンの最初のオブジェクトにあるプロパティを参照します。
言い換えると、最初にオブジェクトがプロパティを持っているか調べられます。
オブジェクトが指定した名前のプロパティを持っている場合、それが目的とするプロパティです。そのオブジェクトに目的のプロパティが含まれていない場合、そのオブジェクトのプロトタイプが次に検査されます。
クラスベースのオブジェクト指向言語では、一般に、状態はインスタンスによって運ばれ、メソッドはクラスによって運ばれ、継承は構造と動作のみです。 ECMAScriptでは、状態とメソッドはオブジェクトによって伝達されますが、構造、動作、および状態はすべて継承されます。
プロトタイプに含まれる、特定のプロパティを直接含まないすべてのオブジェクトは、そのプロパティとその値を共有します。 図1はこれを示しています。
CFはコンストラクター(およびオブジェクト)です。newを使用して5つのオブジェクトが作成されました:cf1、cf2、cf3、cf4、およびcf5。
これらの各オブジェクトには、「q1」および「q2」という名前のプロパティが含まれています。
破線は、暗黙的なプロトタイプの関係を表しています。たとえば、cf3のプロトタイプはCFpです。
コンストラクターCF自体には、「P1」と「P2」という2つのプロパティ自体があり、CFp、cf1、cf2、cf3、cf4、またはcf5からは見えません。
CFpの「CFP1」という名前のプロパティは、「q1」、「q2」というCFpの暗黙的なプロトタイプチェーンにあるプロパティと同様に、cf1、cf2、cf3、cf4、およびcf5(CFではない)によって共有されます または「CFP1」。 CFとCFpの間に暗黙的なプロトタイプリンクがないことに注意してください。
ほとんどのクラスベースのオブジェクト言語とは異なり、値を割り当てることにより、プロパティを動的にオブジェクトに追加できます。 つまり、コンストラクターは、構築されたオブジェクトのプロパティのすべてまたはいずれかに名前を付けたり、値を割り当てたりする必要はありません。 上記の図では、CFpのプロパティに新しい値を割り当てることにより、cf1、cf2、cf3、cf4、およびcf5の新しい共有プロパティを追加できます。
ECMAScriptオブジェクトは本質的にクラスベースではありませんが、コンストラクター関数、プロトタイプオブジェクト、およびメソッドの一般的なパターンに基づいてクラスのような抽象化を定義すると便利です。 ECMAScript組み込みオブジェクト自体は、このようなクラスのようなパターンに従います。 ECMAScript 2015から、ECMAScript言語には構文クラスの定義が含まれており、プログラマーは組み込みオブジェクトで使用されるのと同じクラスのような抽象化パターンに準拠するオブジェクトを簡潔に定義できます。
4.2.2 strictバリアント(The Strict Variant of ECMAScript)
ECMAScriptは、その言語の一部のユーザーが、その言語で利用可能ないくつかの機能の使用を制限したいと考える可能性を認識しています。
セキュリティ上の理由から、エラーが発生しやすい機能を回避するため、拡張されたエラーチェックを取得するため、またはその他の理由で制限する場合があります。
この可能性をサポートするために、ECMAScriptは言語のstrict(厳密な)バリアントを定義しています。 strictバリアントは、特定の構文およびセマンティック機能を除外し、一部の機能の詳細なセマンティクスを変更します。通常はエラーではない状況でエラー例外をスローすることで、エラー条件を追加します。
ECMAScriptのstrictバリアントは、通常、言語のstrictモードと呼ばれます。
strictモードの選択と、strictモードの構文とセマンティクスの使用は、個々のECMAScriptソーステキスト単位レベルで明示的に行われます。
strictモードは構文ソーステキストユニットのレベルで選択されるため、ソーステキストユニット内でのみ影響します。
strictモードは複数のソーステキストユニットで、一貫して動作する必要があるECMAScriptセマンティクスの側面を制限または変更しません。
完全なECMAScriptプログラムは、strictモードと非strictモードの両方をECMAScriptソーステキストユニットで使用できます。
この場合、strictモードは、strictモードのソーステキストユニット内で定義されたコードを実行する場合にのみ適用されます。
ECMAScript実装は、この仕様に準拠するために、非strictモードと、strictモードの両方を実装する必要があります。さらに、非strictモードとstrictモードのソーステキストの組み合わせを1つの複合プログラムとしてサポートする必要があります。
4.3 用語と定義(Terms and Definitions)
このドキュメントでは、次の用語と定義が適用されます。
4.3.1 型(type)
この仕様の6章で定義されているデータ値のセット
4.3.2 プリミティブ値(primitive value)
6章で定義されているUndefined、Null、Boolean、Number、BigInt、Symbol、またはString型のいずれかのメンバー
4.3.3 オブジェクト(object)
タイプObjectのメンバー
4.3.4 コンストラクター(constructor)
オブジェクトを作成および初期化する関数オブジェクト
4.3.5 プロトタイプ(prototype)
他のオブジェクトの共有プロパティを提供するオブジェクト
コンストラクターの「プロトタイプ」プロパティは、プログラム式のconstructor.prototypeによって参照でき、オブジェクトのプロトタイプに追加されたプロパティは、継承を通じて、プロトタイプを共有するすべてのオブジェクトによって共有されます。
または、Object.create組み込み関数を使用して、明示的に指定したプロトタイプで新しいオブジェクトを作成することもできます
4.3.6 通常のオブジェクト(ordinary object)
オブジェクトとして必須な内部メソッドを持ち、かつデそれらがフォルトの動作をおこなうオブジェクト
4.3.7 エキゾチックなオブジェクト(exotic object)
1つ以上の重要な内部メソッドが、デフォルトの動作をおこなわないオブジェクト
4.3.8 標準オブジェクト(standard object)
この仕様でセマンティクスが定義されているオブジェクト
4.3.9 組み込みオブジェクト(built-in object)
ECMAScript実装によって指定および提供されるオブジェクト
4.3.10 undefined値(undefined value)
変数に値が割り当てられていないときに使用されるプリミティブ値
4.3.11 Undefined型(Undefined type)
唯一の値がundefined値である型
4.3.12 null値(null value)
オブジェクト値が意図的に存在しないことを表すプリミティブ値
4.3.13 Null型(Null type)
唯一の値がnull値である型
4.3.14 ブール値(Boolean value)
ブール型のメンバー
4.3.15 ブール型(Boolean type)
プリミティブ値trueおよびfalseで構成される型
4.3.16 ブールオブジェクト(Boolean object)
標準の組み込みブールコンストラクターのインスタンス
4.3.17 String値(String value)
0個以上の16ビット符号なし整数値の有限順序シーケンスであるプリミティブ値
4.3.18 String型(String type)
String値のセット
4.3.19 Stringオブジェクト(String object)
標準の組み込みStringコンストラクターのインスタンス
4.3.20 Number値(Number value)
倍精度64ビットバイナリ形式のIEEE 754-2019値に対応するプリミティブ値
4.3.21 Number型(Number type)
Not-a-Number(NaN)値、正のInfinity、負のInfinityを含むすべての数値のセット
4.3.22 Numberオブジェクト(Number object)
標準の組み込みNumberコンストラクターのインスタンス
4.3.23 Infinity
正の無限の数値であるNumber値
4.3.24 NaN
IEEE 754-2019の「Not-a-Number」値であるNumber値
4.3.25 BigInt値(BigInt value)
任意精度の整数値に対応するプリミティブ値
4.3.26 BigInt型(BigInt type)
BigInt値のセット
4.3.27 BigIntオブジェクト(BigInt object)
標準の組み込みBigIntコンストラクターのインスタンス
4.3.28 Symbol値(Symbol value)
一意の非文字列オブジェクトプロパティキーを表すプリミティブ値
4.3.29 Symbol型(Symbol type)
Symbol値のセット
4.3.30 Symbolオブジェクト(Symbol object)
標準の組み込みSymbolコンストラクターのインスタンス
4.3.31 関数(function)
サブルーチンとして呼び出すことができるObject型のメンバー
4.3.32 組み込み関数(built-in function)
関数である組み込みオブジェクト
4.3.33 プロパティ(property)
キー(文字列値またはシンボル値)と値を関連付けるオブジェクトの一部
4.3.34 メソッド(method)
プロパティの値である関数
4.3.35 組み込みメソッド(built-in method)
組み込み関数であるメソッド
4.3.36 属性(attribute)
プロパティのいくつかの特性を定義する内部値
4.3.37 独自プロパティ(own property)
オブジェクトが直接所持しているプロパティ
4.3.38 継承プロパティ(inherited property)
独自プロパティではない、オブジェクトのプロトタイプのプロパティ。
※プロトタイプの独自プロパティだけでなく、プロトタイプ内の継承プロパティも含まれる。
4.4 この仕様の構成(Organization of This Specification)
この仕様の残りの部分は、次のように構成されています。
5章は、仕様全体で使用される表記規則を定義しています。
6〜9章は、ECMAScriptプログラムが動作する実行環境を定義します。
10から16章は、構文エンコードとすべての言語機能の実行セマンティクスを含む実際のECMAScriptプログラミング言語を定義します。
17〜26章は、ECMAScript標準ライブラリを定義しています。 それらには、実行時にECMAScriptプログラムで使用できるすべての標準オブジェクトの定義が含まれています。
27章は、SharedArrayBuffer-backedメモリへのアクセスのメモリ一貫性モデルと、Atomicsオブジェクトのメソッドについて説明しています。
A.prototype={ };
new式でオブジェクト作成。
B = new A();
とすると、
B.プロパティの値への暗黙的な参照 => A.prototypeへの参照となる。
B.prototype => A.prototypeではない